There are many differences such as compiled vs perceived-as-interpreted, pure vs hybrid, faster vs perceived-as-slower, etc. Some of these aren't true (ex: a large portion of a typical Smalltalk program can be compiled by current implementations, and some Smalltalk implementations perform reasonably well). But none of these effect the programmer as much as the following three issues:
* strong typing vs weak typing (some say 'static vs dynamic')
* how you use inheritance
* value vs reference semantics
The first two differences are illuminated in the remainder of this section; the third point is the subject of the section that follows.
If you're a Smalltalk programmer who wants to learn C++, you'd be very wise to study the next three questions carefully. Historically there have been many attempts to 'make' C++ look/act like Smalltalk, even though the languages are very Very different. This hasn't always lead to failures, but the differences are significant enough that it has lead to a lot of needless frustration and expense. The quotable quote of the year goes to Bjarne Stroustrup at the 'C++ 1995' panel discussion, 1990 C++-At-Work conference, discussing library design: